#ifndef _RESTOREVISITOR_H_
#define _RESTOREVISITOR_H_
#include "ast/VisitorBase.h"
class CramBuilder;

class RestoreVisitor: public VisitorBase
{
public:
    RestoreVisitor(CramBuilder* builder);
    virtual void traverse(const SimpleNodePtr& node);
    virtual void unhandled_node(const SimpleNodePtr& node);
    virtual void visitSuite(const QSharedPointer<Suite>& node);

    virtual void visitImport(const ImportPtr& node);
    virtual void visitImportFrom(const ImportFromPtr& node);
    virtual void visitTryExcept(const TryExceptPtr& node);
    virtual void visitClassDef(const ClassDefPtr& node);
    virtual void visitFunctionDef(const FunctionDefPtr& node);
    virtual void visitAssign(const AssignPtr& node);
    virtual void visitName(const NamePtr& /*node*/);
    virtual void visitPass(const PassPtr& /*node*/);
    virtual void visitRaise(const RaisePtr& /*node*/);
    virtual void visitIf(const IfPtr& /*node*/);


    virtual void visitAssert(const AssertPtr& /*node*/) {}
    virtual void visitAttribute(const AttributePtr& /*node*/) {}
    virtual void visitAugAssign(const AugAssignPtr& /*node*/) {}
    virtual void visitBinOp(const BinOpPtr& /*node*/) {}
    virtual void visitBoolOp(const BoolOpPtr& /*node*/) {}
    virtual void visitBreak(const BreakPtr& /*node*/) {}
    virtual void visitCall(const CallPtr& /*node*/) {}
    virtual void visitCompare(const ComparePtr& /*node*/) {}
    virtual void visitComprehension(const ComprehensionPtr& /*node*/) {}
    virtual void visitContinue(const ContinuePtr& /*node*/) {}
    virtual void visitDelete(const DeletePtr& /*node*/) {}
    virtual void visitDict(const DictPtr& /*node*/) {}
    virtual void visitDictComp(const DictCompPtr& /*node*/) {}
    virtual void visitEllipsis(const EllipsisPtr& /*node*/) {}
    virtual void visitExpr(const ExprPtr& /*node*/);
    virtual void visitExpression(const ExpressionPtr& /*node*/) {}
    virtual void visitExtSlice(const ExtSlicePtr& /*node*/) {}
    virtual void visitFor(const ForPtr& /*node*/) {}
    virtual void visitGeneratorExp(const GeneratorExpPtr& /*node*/) {}
    virtual void visitGlobal(const GlobalPtr& /*node*/) {}
    virtual void visitIfExp(const IfExpPtr& /*node*/) {}
    virtual void visitIndex(const IndexPtr& /*node*/) {}
    virtual void visitInteractive(const InteractivePtr& /*node*/) {}
    virtual void visitLambda(const LambdaPtr& /*node*/) {}
    virtual void visitList(const ListPtr& /*node*/) {}
    virtual void visitListComp(const ListCompPtr& /*node*/) {}
    virtual void visitModule(const ModulePtr& /*node*/) {}
    virtual void visitNameTok(const NameTokPtr& /*node*/) {}
    virtual void visitNonLocal(const NonLocalPtr& /*node*/) {}
    virtual void visitNum(const NumPtr& /*node*/) {}
    virtual void visitRepr(const ReprPtr& /*node*/) {}
    virtual void visitReturn(const ReturnPtr& /*node*/) {}
    virtual void visitSet(const SetPtr& /*node*/) {}
    virtual void visitSetComp(const SetCompPtr& /*node*/) {}
    virtual void visitSlice(const SlicePtr& /*node*/) {}
    virtual void visitStarred(const StarredPtr& /*node*/) {}
    virtual void visitStr(const StrPtr& /*node*/) {}
    virtual void visitStrJoin(const StrJoinPtr& /*node*/) {}
    virtual void visitSubscript(const SubscriptPtr& /*node*/) {}
    virtual void visitTryFinally(const TryFinallyPtr& /*node*/) {}
    virtual void visitTuple(const TuplePtr& /*node*/) {}
    virtual void visitUnaryOp(const UnaryOpPtr& /*node*/) {}
    virtual void visitWhile(const WhilePtr& /*node*/) {}
    virtual void visitWith(const WithPtr& /*node*/) {}
    virtual void visitWithItem(const WithItemPtr& /*node*/) {}
    virtual void visitYield(const YieldPtr& /*node*/) {}

private:
    QString makeCallArgs(const ExprTypeList& args);
    QString makeValue(const SimpleNodePtr& value);
private:
    CramBuilder* _builder;
    int _inTry;
    QString _exceptAttr;
};

#endif
